package com.xuzm.system.utils;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 环形map，非线程安全
 * 满时会移除最早的数据
 */
public class CircularMap<K, V> extends LinkedHashMap<K, V> {
    private final int maxEntries;

    /**
     * 构造函数，初始化一个固定大小的环形Map
     * @param maxEntries 最大容量
     */
    public CircularMap(int maxEntries) {
        super(maxEntries + 1, 1.0f, true); // 最后一个参数true表示访问顺序
        this.maxEntries = maxEntries;
    }

    /**
     * 重写removeEldestEntry方法，当Map的大小超过maxEntries时，返回true以移除最旧的元素
     * @param eldest 最旧的键值对
     * @return 如果需要移除最旧的元素返回true
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > maxEntries;
    }

    public static void main(String[] args) {
        CircularMap<String, Integer> circularMap = new CircularMap<>(3);

        // 添加元素
        circularMap.put("A", 1);
        circularMap.put("B", 2);
        circularMap.put("C", 3);
        System.out.println("After adding A, B, C: " + circularMap);

        // 添加新元素，旧元素被移除
        circularMap.put("D", 4);
        System.out.println("After adding D: " + circularMap);

        // 再次添加新元素
        circularMap.put("E", 5);
        System.out.println("After adding E: " + circularMap);

        // 再次添加新元素
        circularMap.put("C", 5);
        System.out.println("After adding C: " + circularMap);

        // 再次添加新元素
        circularMap.put("C", 5);
        System.out.println("After adding C: " + circularMap);
    }
}